package com.zf.mall.common.util;

import java.util.Date;

import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;

/***
 * 
 * 该类在高并发的分布式系统中, 最好封装为一个服务，每次（加分布式锁,部署为不同的终端ID，数据中心ID）
 * 批量生成唯一ID，放在系统缓存中通过这个服务分发出去。
 * 这里系统并发不高的情况，单机生成的ID可以满足大部分使用场景
 * @author zyf
 * 
 * 
 * 本机实测 : 16G内存   I7 2.6HZ CPU
 * 产生1000000 个ID总耗时2秒
 *
 */

public class IDUtils {

	private long workerId = 0;// 为终端ID
	private long datacenterId = 1;// 数据中心ID
	private Snowflake snowflake = IdUtil.createSnowflake(workerId, datacenterId);



	public synchronized long snowflakeId() {
		return snowflake.nextId();
	}

	public synchronized long snowflakeId(long workerId, long datacenterId) {
		Snowflake snowflake = IdUtil.createSnowflake(workerId, datacenterId);
		return snowflake.nextId();
	}
	
	public static void main(String[] args) {
		int count = 1000000;
		IDUtils idutil = new IDUtils();
		Long st = new Date().getTime();
		for(int i = 0 ; i < count ; i++) {
			Long id = idutil.snowflakeId();
			System.out.println(id);
		}
		Long et = new Date().getTime();
		
		System.out.println("产生"+count+" 个ID总耗时" + (et - st) / 1000 + "秒");
	}

}
